//
//  UITextView+emoticons.swift
//  03-表情键盘
//
//  Created by 房城鸿 on 15/10/19.
//  Copyright © 2015年 房兰峰. All rights reserved.
//

import UIKit

extension UITextView{

    
    /// 返回完成的表情字符串
    var emoticonText:String{
        let attrText = attributedText
        
        //创建一个可变字符串
        var strM = String()
        
        // 遍历
        attrText.enumerateAttributesInRange(NSRange(location: 0, length: attrText.length), options: []) { (dict, range, _) -> Void in
            //如果字典中包含 NSAttachment Key 就说明是图片
            // 新的问题： 如何从 attachment 中获得 表情文字 【哈哈】
            if let attachment = dict["NSAttachment"] as? EmoticonAttachment {
                //print("表情图片\(attachment.chs)")
                strM += attachment.chs
                
            }else{
                let str = (attrText.string as NSString).substringWithRange(range)
                //print("文本内容 \(str)")
                strM += str
            }
        }
        
        return strM
    }
    
    ///  插入表情符号
    ///
    ///  - parameter emoticon: 表情符号模型
    func insertEmoticon(emoticon:Emoticon){
        
        //0. 空表情
        if emoticon.isEmpty{
            return
        }
        //1. 删除按钮
        if emoticon.isRemove{
            //删除
            deleteBackward()
            return
        }
        
        // 2. emoji
        if emoticon.emoji != nil{
            replaceRange(selectedTextRange!, withText: emoticon.emoji!)
            return
        }
        
        // 3. 表情图片 .一定有图片
        // 注意，如果是单纯的复制，会造成覆盖，所以需要处理一下
        let imageText = EmoticonAttachment.emoticonAttributeText(emoticon, font: font!)
        
        // 1. 从textView 从取出属性文本
        let strM = NSMutableAttributedString(attributedString: attributedText)
        
        //2. 插入图片文字
        strM.replaceCharactersInRange(selectedRange, withAttributedString: imageText)
        
        //3. 重新设置textView 的内容
        //3.1.记录当前光标位置
        let range = selectedRange
        
        //3.2 .设置内容
        attributedText = strM
        
        //3.3. 恢复光标位置
        selectedRange = NSRange(location: range.location + 1, length: 0)
    }
}


